package org.example.friend_test.service.impl;

import org.example.friend_test.entity.Couple;
import org.example.friend_test.mapper.CoupleMapper;
import org.example.friend_test.service.CoupleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 情侣关系服务实现类
 * 
 * 该类实现了CoupleService接口，提供情侣关系的核心业务逻辑处理，
 * 包括创建、查询、更新和删除情侣关系等功能。
 * 
 * @author 系统生成
 * @version 1.0
 * @since 2024-01-01
 */
@Service
public class CoupleServiceImpl implements CoupleService {
    
    /**
     * 情侣关系数据访问层接口
     */
    @Autowired
    private CoupleMapper coupleMapper;
    
    /**
     * 创建新的情侣关系
     * 
     * 该方法会检查两个朋友是否已经在其他情侣关系中，
     * 如果都没有，则创建新的情侣关系。
     * 
     * @param friend1Id 第一个朋友的ID
     * @param friend2Id 第二个朋友的ID
     * @param startDate 开始日期，格式为ISO_LOCAL_DATE (yyyy-MM-dd)
     * @return true 创建成功，false 创建失败（朋友已在情侣关系中）
     * @throws IllegalArgumentException 当日期格式不正确时抛出
     */
    @Override
    public boolean createCouple(Long friend1Id, Long friend2Id, String startDate) {
        // 检查两个朋友是否已经在情侣关系中
        if (coupleMapper.countByFriendId(friend1Id) > 0 || coupleMapper.countByFriendId(friend2Id) > 0) {
            return false;
        }
        
        // 解析开始日期
        LocalDate start = LocalDate.parse(startDate, DateTimeFormatter.ISO_LOCAL_DATE);
        
        // 创建情侣关系
        Couple couple = new Couple(friend1Id, friend2Id, start);
        return coupleMapper.insert(couple) > 0;
    }
    
    /**
     * 根据ID查询情侣关系
     * 
     * @param id 情侣关系ID
     * @return 情侣关系对象，如果不存在则返回null
     */
    @Override
    public Couple getCoupleById(Long id) {
        return coupleMapper.selectById(id);
    }
    
    /**
     * 获取所有活跃的情侣关系
     * 
     * 该方法返回状态为'active'的所有情侣关系，
     * 通常用于显示当前正在进行的恋爱关系。
     * 
     * @return 活跃情侣关系列表，如果没有则返回空列表
     */
    @Override
    public List<Couple> getAllActiveCouples() {
        return coupleMapper.selectAllActive();
    }
    
    /**
     * 根据朋友ID查询相关的情侣关系
     * 
     * 该方法会查询指定朋友作为情侣1或情侣2的所有情侣关系，
     * 包括活跃和已结束的关系。
     * 
     * @param friendId 朋友ID
     * @return 相关的情侣关系列表，如果没有则返回空列表
     */
    @Override
    public List<Couple> getCouplesByFriendId(Long friendId) {
        return coupleMapper.selectByFriendId(friendId);
    }
    
    /**
     * 检查朋友是否在情侣关系中
     * 
     * 该方法用于快速判断一个朋友是否已经处于情侣关系中，
     * 通常用于创建新情侣关系前的验证。
     * 
     * @param friendId 朋友ID
     * @return true 朋友已在情侣关系中，false 朋友不在情侣关系中
     */
    @Override
    public boolean isFriendInCouple(Long friendId) {
        return coupleMapper.countByFriendId(friendId) > 0;
    }
    
    /**
     * 结束情侣关系
     * 
     * 该方法将指定ID的情侣关系状态更新为'ended'，
     * 表示该情侣关系已经结束，但记录仍然保留。
     * 
     * @param id 情侣关系ID
     * @return true 更新成功，false 更新失败
     */
    @Override
    public boolean endCouple(Long id) {
        return coupleMapper.updateStatus(id, "ended") > 0;
    }
    
    /**
     * 删除情侣关系
     * 
     * 该方法会从数据库中永久删除指定的情侣关系记录，
     * 此操作不可恢复，请谨慎使用。
     * 
     * @param id 情侣关系ID
     * @return true 删除成功，false 删除失败
     */
    @Override
    public boolean deleteCouple(Long id) {
        return coupleMapper.deleteById(id) > 0;
    }
    
    /**
     * 计算情侣在一起的天数
     * 
     * 该方法根据开始日期计算到当前日期的天数，
     * 用于显示情侣在一起的时间长度。
     * 
     * @param startDate 开始日期，格式为ISO_LOCAL_DATE (yyyy-MM-dd)
     * @return 在一起的天数，如果日期无效则返回null
     */
    @Override
    public Long calculateDaysTogether(String startDate) {
        return coupleMapper.calculateDaysTogether(startDate);
    }
}
